#ifndef ESTRATEGIA_MOVIMIENTO_PERSEGIR_H
#define ESTRATEGIA_MOVIMIENTO_PERSEGIR_H

#include "EstrategiaMovimientoFantasma.h"
#include "EscenarioModelo.h"

#include "Lista.h"
#include "IteradorLista.h"
#include "ComparadorPunto.h"

class EstrategiaMovimientoPersegir : public EstrategiaMovimientoFantasma{

	Punto* calcularMasCercano(Lista<Punto>* lista, Punto* puntoActual){
		return EstrategiaMovimientoFantasma::calcularMasCercano(lista, puntoActual,this->getPresa()->getPosicion());
	}

	
	virtual void decidirNuevaDireccion(Punto* punto){

		Lista<Punto>* lista = this->getListaPuntosPosibles(punto);
		lista->setComparador(new ComparadorPunto());
		Punto* masCercano = this->calcularMasCercano(lista,punto);

		this->actualizarDirecciones(punto, masCercano);

		Direccion* dirInvertida = new Direccion(this->direccionActual->getValor());
		dirInvertida->invertir();

		int aleatorio = rand() % 100; 
		// Si estoy por volver en direccion contraria pruebo otra opcion
		if(this->direccionActual && this->direccionAnterior &&
			dirInvertida->equals(this->direccionAnterior) && aleatorio < 80){
			lista->quitar(masCercano);
			Punto* anteriorMasCercano = masCercano;
			Punto* masCercano = this->calcularMasCercano(lista,punto);
			// Si la segunda alternativa no es quedarse quieto, entonces la uso
			if(!masCercano->equals(punto))
				this->actualizarDirecciones(punto, masCercano);
		}	
		
		delete dirInvertida;
		delete lista;
	}

	public:

		EstrategiaMovimientoPersegir(ObjetoVivo *unaPresa,unsigned short velocidad)
			: EstrategiaMovimientoFantasma(unaPresa, new Direccion(Direccion::DERECHA), velocidad){        
		}

       	
};
#endif